package com.siqi.hr.system.organization.dao.intf;

import com.siqi.hr.system.organization.entity.Dept;
import com.siqi.hr.system.organization.entity.EmpReDept;

import java.util.List;
import java.util.Map;

/**
 * 部门信息维护dao接口层
 * @author     xiaogq
 * Created by xiaogoingqin on 2016/7/21.
 */
public interface DeptDao {

    /**
     * 根据id获取部门
     * @param     tableName   表名
     * @param     id           组织id
     * @author ChenL
     */
    public Dept getById(String tableName,String id);

    /**
     * 查询根部门信息
     * @author    xiaogq
     * @return
     */
    public Dept queryRootDept(String tableName) throws Exception;

    /**
     * 获取组织所有数据
     * @author    xiaogq
     * @param     tableName   表名
     * @return
     */
    public List<Dept> queryAllDept(String tableName);

    /**
     * 根据父级部门的层级获取所有子部门及其本身
     * @author ChenL
     */
    public List<Dept> queryAllChildDeptByRank(String deptTableName,String parentRank);

    /**
     * 添加组织保存并返回部门id方法
     * @param tableName   组织表名
     * @param dept         组织对象信息
     * @return
     */
    public long saveAddDept(String tableName,final Dept dept) throws Exception;

    /**
     * 批量导入部门
     * @author ChenL
     */
    public void batchAddDept(String deptTableName,List<Dept> deptList) throws Exception;

    /**
     * 批量更新部门
     * @author ChenL
     */
    public void batchUpdateDepts(String deptTableName,List<Map<String,Object>> depts) throws Exception;

    /**
     * 添加组织保存方法
     * @param tableName   组织表名
     * @param dept         组织对象信息
     * @return
     */
    public int saveEditDept(String tableName,final Dept dept);

    /**
     * 根据部门(组织)id修改是否是父级部门标识
     * @author         xiaogq
     * @param tableName   组织表名
     * @param deptId      部门id
     * @param deptRank    部门等级编码
     */
    public void updateDeptRankById(String tableName,long deptId,String deptRank);

    /**
     * 根据部门(组织)id修改是否是父级部门标识
     * @author         xiaogq
     * @param  ids    移动部门id
     * @param  pId    移动目标部门id
     * @param  pdeptRank    移动目标部门等级
     */
    public int updateDeptPidById(String tableName,String ids,String pId,String pdeptRank, String oriDeptRank);

    /**
     * 根据部门名称判断部门名称是否重复
     * @author          xiaogq
     * @param id          部门id
     * @param deptName   部门记录名称
     * @param tableName   组织表名称
     * @return
     */
    public boolean isRepeatDeptName(Long id,String deptName,String tableName);

    /**
     * 根据当前部门id查询该部门是否有子部门(组织)
     * @author          xiaogq
     * @param tableName         组织表名
     * @param parentId          部门id
     * @return
     */
    public boolean isChildrenNodes(String tableName,String parentId);

    /**
     * 根据id删除组织记录
     * @param tableName   组织表名
     * @param id           部门id
     */
    public void delDept(String tableName,String id);

    /**
     * 更新部门排序
     * @param orderIds
     * @return
     */
    public void updateDeptOrders(String tableName, String orderIds);

    /**
     * 通过员工id及部门id查询关系表是否存在数据
     * @author ChenL
     */
    public long countByRelation(String zEmpDetpTableName,String empId,String deptId);

    /**
     * 批量插入人员-部门关系表
     * @author ChenL
     */
    public void batchSaveEmpAndDeptRelation(String tableName, final List<Map<String, Object>> zDeptMaps) throws Exception;

    /**
     * 根据员工id查询相关部门
     * @param empReDept     员工相关部门对象
     * @return
     */
    public List<Map<String,Object>> queryEmpRelateDeptAll(EmpReDept empReDept);

    /**
     * 根据员工id查询相关部门总记录数
     * @param empReDept     员工相关部门对象
     * @return
     */
    public int queryEmpRelateDeptCountAll(EmpReDept empReDept);

    /**
     * 根据id删除员工部门关系记录
     * @author   xioagq
     * @param    rId        员工与部门相关关系表id
     * @return
     */
    public int delEmpRelateDept(String rId);
}
